package com.zzh.lib.core.utils;

import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.Settings;
import android.text.TextUtils;

import com.zzh.lib.core.HLibrary;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * Created by ZZH on 2020/8/5.
 *
 * @Date: 2020/8/5
 * @Email: zzh_hz@126.com
 * @QQ: 1299234582
 * @Author: zzh
 * @Description: 系统设置。跳转到系统界面。
 */
public class HSystemUtils {
    /**
     * 跳转到app详情界面
     */
    public static void startAppDetailSettings() {
        String packageName = HLibrary.getInstance().getContext().getPackageName();
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setData(Uri.fromParts("package", packageName, null));
        HLibrary.getInstance().getContext().startActivity(intent);
    }

    /**
     * 蓝牙设置界面
     *
     * @param reqCode 请求值
     */
    public static void startBluetoothSettings(int reqCode) {
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        HLibrary.getLastActivity().startActivityForResult(enableBtIntent, reqCode);
    }


    public static String getSystemProperty(String propName) {
        String line;
        BufferedReader input = null;
        try {
            Process p = Runtime.getRuntime().exec("getprop " + propName);
            input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024);
            line = input.readLine();
            input.close();
        } catch (IOException ex) {
            LogUtils.e("Unable to read sysprop " + propName + ", " + ex.getMessage());
            return null;
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    LogUtils.e("Exception while closing InputStream " + e.getMessage());
                }
            }
        }
        return line;
    }

    private static boolean isIntentAvailable(Intent intent) {
        if (intent == null) {
            return false;
        }
        return HLibrary.getInstance().getContext().getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() > 0;
    }

    /**
     * 检测手机是否处于免打扰模式
     * <p>
     *
     * @return 0 未开启免打扰，1 允许优先内容打扰（已开启免打扰），2 禁止所有打扰（已开启免打扰），
     * 3 允许闹钟打扰（已开启免打扰）, -1 未加测到系统设置
     */
    public static int getZenModel() {
        try {
            int zenMode = Settings.Global.getInt(HLibrary.getInstance().getContext().getContentResolver(), "zen_mode");
            LogUtils.e("---------免打扰模式为zenMode：" + zenMode);
            return zenMode;
        } catch (Settings.SettingNotFoundException e) {
            LogUtils.e("-----方法zen_mode不存在--");
        }
        return -1;
    }

    /**
     * 跳转到免打扰系统设置界面。
     */
    public static void jumpZenModelSettings() {
        Intent intent = new Intent(Settings.ACTION_ZEN_MODE_PRIORITY_SETTINGS);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        HLibrary.getInstance().getContext().startActivity(intent);
    }

    /**
     * 文件的管理权限，授权页面。
     *
     * @param context 上下文
     */
    public static void requestManageAppAllFilePermission(Context context) {
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
        intent.setData(Uri.parse("package:" + context.getPackageName()));
        context.startActivity(intent);
    }

    /**
     * 判断是否有管理存储的权限。
     *
     * @return true 可以管理
     */
    public static boolean checkManageAppAllFilePermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            return Environment.isExternalStorageManager();
        }
        return false;
    }

    /**
     * 获取App的包名
     *
     * @return App的包名
     */
    public static String getPackageName() {
        return HLibrary.getAppContext().getPackageName();
    }

    /**
     * 获取App的versionCode
     *
     * @return App的 versionCode
     */
    public static int getVersionCode() throws PackageManager.NameNotFoundException {
        return HLibrary.getAppContext().getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
    }

    /**
     * 获取App的versionCode
     *
     * @return App的 versionCode
     */
    public static String getVersionName() throws PackageManager.NameNotFoundException {
        return HLibrary.getAppContext().getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
    }

    /**
     * 获取字符串的MD5
     *
     * @param res 字符串
     * @return MD5 值
     */
    public static String getMd5(String res) {
        if (TextUtils.isEmpty(res)) {
            return "";
        }

        char hexDigits[] = { // 用来将字节转换成 16 进制表示的字符
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

        String s = "";
        java.security.MessageDigest md = null;
        try {
            md = java.security.MessageDigest.getInstance("MD5");
            md.update(res.getBytes());
            byte tmp[] = md.digest(); // MD5 的计算结果是一个 128 位的长整数，
            // 用字节表示就是 16 个字节
            char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话，使用两个字符，
            // 所以表示成 16 进制需要 32 个字符
            int k = 0; // 表示转换结果中对应的字符位置
            for (int i = 0; i < 16; i++) { // 从第一个字节开始，对 MD5 的每一个字节
                // 转换成 16 进制字符的转换
                byte byte0 = tmp[i]; // 取第 i 个字节
                str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换,
                // >>> 为逻辑右移，将符号位一起右移
                str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
            }
            s = new String(str); // 换后的结果转换为字符串
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        return s;
    }


    /**
     * 获取文件的MD5
     *
     * @param path 文件路径
     * @return md5
     */
    public static String getFileMD5(String path) {
        BigInteger bi = null;
        try {
            byte[] buffer = new byte[2048];
            int len = 0;
            MessageDigest md = MessageDigest.getInstance("MD5");
            File f = new File(path);
            FileInputStream fis = new FileInputStream(f);
            while ((len = fis.read(buffer)) != -1) {
                md.update(buffer, 0, len);
            }
            fis.close();
            byte[] b = md.digest();
            StringBuilder sb = new StringBuilder();

            //不足32位，高位补0
            for (byte tmp : b) {
                int c = tmp & 0xFF;
                if (c < 16) {
                    sb.append('0');
                }
                sb.append(Integer.toHexString(c));
            }

            return sb.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }
}
